import axios from 'axios'
import type { AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from 'axios'
import { EnvConfig } from '@/utils/env'

// 创建 axios 实例
const service: AxiosInstance = axios.create({
    baseURL: EnvConfig.apiUrl,
    timeout: 15000,
    headers: {
        'Content-Type': 'application/json;charset=utf-8'
    }
})

// 请求拦截器
service.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
        // 在这里可以添加统一的请求头，比如 token
        const token = uni.getStorageSync('token')
        if (token && config.headers) {
            config.headers['Authorization'] = `Bearer ${token}`
        }
        return config
    },
    (error: any) => {
        return Promise.reject(error)
    }
)

// 响应拦截器
service.interceptors.response.use(
    (response: AxiosResponse) => {
        const { code, message, data } = response.data

        // 根据自定义错误码判断请求是否成功
        if (code === 200) {
            return data
        } else {
            // 处理业务错误
            uni.showToast({
                title: message || '操作失败',
                icon: 'none'
            })
            return Promise.reject(new Error(message || '操作失败'))
        }
    },
    (error: any) => {
        // 处理 HTTP 网络错误
        let message = ''
        // HTTP 状态码判断
        switch (error.response?.status) {
            case 401:
                message = '登录已过期，请重新登录'
                // 这里可以触发登出操作
                break
            case 403:
                message = '没有权限'
                break
            case 404:
                message = '请求地址错误'
                break
            case 500:
                message = '服务器故障'
                break
            default:
                message = '网络连接故障'
        }

        // 开发环境下打印错误信息
        if (EnvConfig.isDev) {
            console.error('请求错误:', error)
        }

        uni.showToast({
            title: message,
            icon: 'none'
        })
        return Promise.reject(error)
    }
)

export default service 